Git 回滚变更
在 Git 里撤销变更的方法很多。和提交一样,撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。
主要有两种方法用来撤销变更,一是 git reset
,还有就是 git revert
。
Git Reset
git reset
通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。
git reset
向上移动分支,原来指向的提交记录就跟从来没有提交过一样。
执行
git reset HEAD~1
Git 把 master
分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。
注:在 reset
后,C2 所做的变更还在,但是处于未加入暂存区状态。
虽然在你的本地分支中使用 git reset
很方便,但是这种 “改写历史” 的方法对大家一起使用的 远程分支是无效的哦!
Git Revert
为了撤销更改并分享给别人,我们需要使用 git revert
# 注意:这里撤回的是自己 HEAD,不是父节点,这就是和上面的 reset 的区别
# 别写成了 HEAD^
git revert HEAD
可以发现在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2'
引入了更改
这些更改刚好是用来撤销 C2
这个提交的。也就是说 C2'
的状态与 C1
是相同的。
revert
之后就可以把你的更改推送到远程仓库与别人分享啦。
reset 的参数
本质就是操作指针(HEAD)来控制版本的前进后退:
1、基于索引值操作(推荐)
git reset --hard 7f0db4d
# 这里后面的哈希只需要填入部分就行了(所以可以配合上面的 `git reflog` 查看)
2、使用 ^
符号 只能后退
git reset --hard HEAD^
3、使用 ~
符号 只能后退,如果要移动多个版本则使用~
git reset --hard HEAD~3
reset 命令的三个参数的作用
# 谨慎使用 –hard 参数,它会删除回退点之前的所有信息。
# 撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:
--hard
# 用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变
--mixed
# 用于回退到某个版本,它不会触碰暂缓区和工作区,仅仅在本地库移动 HEAD 指针
--soft
所以找回文件
第一种情况:删除前,文件存在时的状态提交到了本地库
操作:git reset --hard [指针位置]
- 删除操作已经提交到本地库:指针位置指向历史记录
- 删除操作尚未提交到本地库:指针位置使用HEAD
第二种情况:删除了文件之后之提交到缓存区,并没提交到本地库,这时直接使用 git reset --hard HEAD
恢复到这个版本更新前就好了